<?php
/* vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 textwidth=150 number: */

/**
 * Classe PessoasController
 *
 * ...
 *
 * PHP versão 5
 *
 * LICENÇA: Este arquivo fonte esta sob o termos da licença MIT.
 *
 * @package   scuf.controller
 * @author    Rodrigo Casara <rodrigocasara@gmail.com>
 * @copyright 2012 Rodrigo Casara
 * @license   MIT License (http://www.opensource.org/licenses/mit-license.php)
 * @version   SVN: $Id$
 * @link
 * @since     SCUF(tm) v 1.0.0
 */

App::uses('AppController', 'Controller');
App::uses('CakeEmail', 'Network/Email');

/**
 * Classe PessoasController
 *
 * {@inheritdoc}
 */
class PessoasController extends AppController {

  /**
   *
   */
  public $helpers = array('Paginator');

  // Cake Callbacks {{{

  /**
   * (non-PHPdoc)
   * @see Controller::beforeFilter()
   */
  public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('adicionar', 'logout');
  }

  //}}}

  /**
   * Descreva o método aqui ...
   */
  public function index() {
    $this->Pessoa->recursive = 0;
    $this->set('pessoas', $this->paginate());
  }

  /**
   * Descreva o método aqui ...
   * @throws BadRequestException
   */
  public function adicionar() {
    if ($this->request->is('post')) {
      if ($this->RequestHandler->isAjax()) {
        $this->autoRender = false;
        $resposta = array(
          'mensagem' => '',
          'sucesso' => false,
          'campos' => array(),
        );
        // Verifica se o id está sendo passado na requisição, para evitar violação de chave primária. {{{
        $okChavePrimaria = true;
        if (isset($this->request->data[$this->Pessoa->alias]['id']) && !empty($this->request->data[$this->Pessoa->alias]['id'])) {
          $id = $this->request->data[$this->Pessoa->alias]['id'];
          if ($this->Pessoa->exists($id)) {
            $okChavePrimaria = false;
            $mensagem = 'Tentativa de violação de registro detectada!';
            // Registra no log {{{
            $msgTexto = "Tentativa de violação de chave primária! DETALHE: Chave (id)=({$id}) já existe." . PHP_EOL .
                        "#0 IP: {$this->request->clientIp()}". PHP_EOL .
                        "#1 HOST: {$this->request->host()}". PHP_EOL .
                        "#2 URL: {$this->request->here()}". PHP_EOL .
                        "#3 DATA: " . serialize($this->request->data);
            $this->log($msgTexto);
            //}}}
            // Envia notificação por e-mail {{{
            $msgHtml = "<p>Tentativa de violação de chave primária! DETALHE: Chave (id)=({$id}) já existe.</p>" .
                       "<p><strong>#0 IP:</strong> <em>{$this->request->clientIp()}</p>" .
                       "<p><strong>#1 HOST:</strong> <em> {$this->request->host()}</p>" .
                       "<p><strong>#2 URL:</strong> <em> {$this->request->here()}</p>" .
                       "<p><strong>#3 DATA:</strong> <em> " . serialize($this->request->data) . "</p>";
            $email = new CakeEmail('gmail');
            $email->to('rodrigocasara@gmail.com', 'Rodrigo Casara');
            $email->subject('[SCUF-ERROR] Violação de chave primária');
            $email->send($msgHtml);
            //}}}
          }
        }
        //}}}
        if ($okChavePrimaria) {
          $this->Pessoa->begin();
          if ($this->Pessoa->save($this->request->data)) {
            $this->Pessoa->commit();
            $resposta['mensagem'] = 'Seu cadastro foi realizado com sucesso.';
            $resposta['sucesso'] = true;
            // TODO: Cadastro realizado com sucesso, usuário deve ser redirecionado para formulário de login (ou voltar para última página?)
          } else {
            $this->Pessoa->rollback();
            if (!empty($this->Pessoa->validationErrors)) {
              $resposta['mensagem'] = 'Há campos obrigatórios que não foram preenchidos ou o valor informado é inválido.';
              $resposta['campos'] = $this->Pessoa->validationErrors;
              // Formata array com as mensagens de validação dos campos com erro. {{{
              $campos = array();
              $valores = array();
              foreach ($resposta['campos'] as $campo => $valor) {
                array_push($campos, "data[{$this->Pessoa->alias}][{$campo}]");
                array_push($valores, $valor[0]);
              }
              //}}}
              $resposta['campos'] = array_combine($campos, $valores);
            } else {
              $resposta['mensagem'] = 'Não foi possível salvar seus dados.';
            }
          }
        }
        echo json_encode($resposta);
      } else {
        throw new BadRequestException();
      }
    } elseif (!$this->RequestHandler->isAjax()) {
      $this->redirect('/#' . $this->request->url);
    }
  }

  /**
   * Descreva o método aqui ...
   */
  public function login() {
    if ($this->request->is('post')) {
      $this->autoRender = false;
      $resposta = array(
        'mensagem' => '',
        'sucesso' => false,
      );
      //
      if ($this->Auth->login()) {
        $mensagem = 'Login efetuado com sucesso.';
        $resposta['urlRedirecionamento'] = $this->Auth->redirect();
        $resposta['usuario'] = $this->Auth->user('nome');
        $resposta['sucesso'] = true;
      } else {
        $mensagem = 'O e-mail e/ou senha informados são inválidos, tente novamente.';
        $resposta['urlRedirecionamento'] = '';
        $resposta['usuario'] = '';
        $resposta['sucesso'] = false;
      }
      //
      /*$this->_instanciarClasseDeVisualizacao();
      $resposta['mensagem'] = $this->View->element('mensagens',
        array(
          'classe' => ($resposta['sucesso'] == true ? 'alert alert-success' : 'alert alert-error'),
          'tipo_mensagem' => ($resposta['sucesso'] == true ? 'Sucesso' : 'Erro'),
          'mensagem' => $mensagem
        )
      );*/
      echo json_encode($resposta);
    } else {
      $this->redirect('/#inicio');
    }
  }

  /**
   * Descreva o método aqui ...
   */
  public function logout() {
    $this->redirect($this->Auth->logout());
  }

  /**
   * Descreva o método aqui ...
   */
  public function recuperarSenha() {
    ;
  }

  /**
   * Descreva o método aqui ...
   */
  public function perfil() {
    ;
  }

}
?>